﻿using System;
using System.Collections;
using System.Configuration;
using wdwp.Desktop.widgetLib.CommonTypes;
using widgetLauncher.Properties;

namespace wdwp.Desktop.Launcher
{   

    /// <summary>
    /// 위젯을 관리하고 실행하는 주 클래스 
    /// </summary>
    public class WidgetLauncher
    {
        /// <summary>
        /// 소스로 존재하는 위젯들을 관리하는 매니저 인스턴스
        /// </summary>
        WidgetSrcManager  m_SrcMng;
        /// <summary>
        /// 실행중인 위젯들을 관리하는 매니저 인스턴스
        /// </summary>
        WidgetProcManager m_ProcMng;
      
        //관리로직중에 발생하는 이벤트들
        public delegate void LogMsgHandler(string msg);
        /// <summary>
        /// 메세지가 발생했을때 이를 알리는 메세지 이벤트 핸들러
        /// </summary>
        public static event LogMsgHandler Message;
        /// <summary>
        /// 에러가 발생했을때 이를 알리는 에러 이벤트 핸들러
        /// </summary>
        public static event LogMsgHandler Error;

        public delegate void LauncherEventHandler(object sender, WidgetEventArgs e);
        /// <summary>
        /// 위젯소스들이 하드디스크에서 모두 검색이 완료되었을때 알리는 이벤트
        /// </summary>
        public static event LauncherEventHandler SrcLoadingCompleted;
        /// <summary>
        /// 실행중인 위젯의 리스트가 변경되었을때 알리는 이벤트 핸들러
        /// </summary>
        public static event LauncherEventHandler ProcListChanged;
                
    
        /// <summary>
        /// 위젯 런처 생성자
        /// 위젯관리에 필요한 모든 요소를 생성
        /// </summary>
        public WidgetLauncher()
        {   
        }


        /// <summary>
        /// 실행중인 위젯 정보들을 리프레시
        /// </summary>
        public void Refresh()
        {
            m_ProcMng.Refresh();
        }


        /// <summary>
        /// 런처 프로그램 시작
        /// </summary>
        public void InitManager()
        {
            try
            {
                //각 매니저 초기화                

                m_ProcMng = new WidgetProcManager();
                WidgetProcManager.ProcListChanged += ProcListChangedHandler;

                m_ProcMng.WaitUntillQuit = false;
                

                string widgetFolderPath = Settings.Default.WidgetSrcFolder;

                m_SrcMng = new WidgetSrcManager(widgetFolderPath);
                WidgetSrcManager.SrcLoadCompleted += SrcLoadCompleteHandler;
                WidgetSrcManager.Message += new WidgetSrcManager.srcManagerEventHandler(WidgetSrcManager_Message);
                m_SrcMng.Start();
            }
            catch (Exception exc)
            {
                if (Error != null)
                    Error(exc.Message);
                else
                    throw exc;
            }
        }

        /// <summary>
        /// 새 위젯을 실행(위젯 로더 실행)
        /// </summary>
        /// <param name="Name">위젯의 이름</param>
        /// <param name="Type">위젯의 타입</param>
        public void RunNewWidget(string Name, string Type)
        {
            try
            {
                int index = m_SrcMng.WidgetSrcList.IndexOf(new sWidgetInfo(Name, 0, 0, Type, null));
                sWidgetInfo startInfo = (sWidgetInfo)m_SrcMng.WidgetSrcList[index];

                //세팅을 직렬화                 
                Serializer.Serialize(Settings.Default.LoaderStartupFileName, startInfo as Object); 

                m_ProcMng.RunNewWidget(startInfo);
            }
            catch (Exception exc)
            {
                throw exc;
            }
        }

        /// <summary>
        /// 현재 실행중인 위젯을 죽임
        /// </summary>
        /// <param name="Pid">프로세스 번호 </param>
        public void KillWidget(int Pid)
        {
            try
            {
                m_ProcMng.KillRunWidget(Pid);
            }
            catch (Exception exc)
            {
                throw exc;
            }
        }


        /// <summary>
        /// 런처 프로그램을 종료
        /// </summary>
        public void ExitLauncher()
        {
            try
            {          
                m_ProcMng.KillAllWidgets();
            }
            catch (Exception exc)
            {
                throw exc;
            }
        }


        /// <summary>
        /// 위젯 폴더에서 소스 로딩이 완료되었을때 발생되는 이벤트
        /// </summary>
        /// <param name="sender">이벤트가 발생된 객체 widgetLauncher</param>
        /// <param name="e">이벤트가 발생된 객체에서 반환된 이벤트 정보</param>
        private void SrcLoadCompleteHandler(object sender, WidgetEventArgs e)
        {
            ArrayList list = e.Content as ArrayList;

            Message("위젯 폴더에서 " + list.Count + "개의 위젯을 발견하여 등록하였습니다.");
            SrcLoadingCompleted(sender, e);
        }


        /// <summary>
        /// 실행중인 위젯들을 모니터링하는 리스트가 변경될때 발생하는 프로세스 리스트 핸들러
        /// </summary>
        /// <param name="sender">WidgetProcManager</param>
        /// <param name="e">위젯 이벤트 Args</param>
        private void ProcListChangedHandler(object sender, WidgetEventArgs e)
        {
            if (e.Msg == WidgetProcManager.MSG_KILL_WIDGET)            
            {
                sWidgetProc proc = (sWidgetProc)e.Content;
                Message("위젯 프로세스 " + proc.procId + " - " + proc.SrcInfo.Name + " 이 " + e.Subject);
            }
              
            ProcListChanged(sender, e);            
        }

        /// <summary>
        ///  위젯 소스 매니저에서 발생한 메세지를 외부로 라우팅 
        /// </summary>
        /// <param name="sender">WidgetSrcManager</param>
        /// <param name="args">위젯 이벤트 Args</param>
        void WidgetSrcManager_Message(object sender, WidgetEventArgs args)
        {
            Message(args.Subject);
        }

    }


}